/*
 * Rame.cpp
 *
 *  Created on: 7 mars 2011
 *      Author: Julien
 */

#include "Rame.h"
#include "Station.h"
#include "Passager.h"

pthread_t* getPassager(int i);

Rame::Rame(Voiture * voiture, Traction * traction) {
	this->voiture = voiture;
	this->traction = traction;
	cout<< "*** Rame créée ***" << endl;
}

void Rame::ouvrirPortes(){
	this->voiture->ouvrirPortes();
}

void Rame::fermerPortes(){
	this->voiture->fermerPortes();
}

void Rame::rejoindreVoiture(Passager * pass){
	this->voiture->monter(pass);
}

void Rame::gererArretStation(){
	// On récupère la station à laquelle la rame se trouve actuellement.
	Station * station = dynamic_cast<Station*>(this->section->getElement(this->positionSection));
	int nbPassagersMontants = station->getNbAttente();
	int nbPassagersDescendants = this->voiture->getAttente();
	if(nbPassagersMontants == 0 && nbPassagersDescendants == 0){
		cout << "====> Il n'y a pas d'attente pour cette station, inutile de s'arrêter !" << endl;
	}
	else{
		this->traction->stopper();
		cout << "====> Faut gérer un truc... <=========" << endl;
		this->alerterPassagers(station);
		this->traction->avancer();
	}
}

void Rame::demarrer(){
	this->traction->avancer();
}

void Rame::arreter(){
	this->traction->stopper();
}

// Retourne le numero de section sur lequel se trouve la rame actuellement.
int Rame::getNumeroSection(){
	return this->numeroSection;
}

Voiture * Rame::getVoiture(){
	return this->voiture;
}

Traction * Rame::getTraction(){
	return this->traction;
}

// Retourne la Section sur laquelle se trouve la Rame.
Section* Rame::getSection(){
	return this->section;
}

// Retourne la position de la rame sur la section actuelle
int Rame::getPosition(){
	return this->positionSection;
}

void Rame::setNumeroSection(int section){
	this->numeroSection = section;
}

void Rame::setSection(Section* sec){
	this->section = sec;
}

void Rame::setPosition(int position){
	this->positionSection = position;
}

// Alerte les passagers de la station courante pour qu'ils montent dans le tram
void Rame::alerterPassagers(Station * station){
	int attenteStation = station->getNbAttente();
	// On recupere le nombre de passagers que peut encore accueillir la voiture.
	int nbrePassagersAutorises = this->voiture->getCapacite() - this->voiture->getNbPassagers();
	Passager ** fileStation = station->getFileAttente();
	//On autorise soit le nombre de passagers autorises
	//soit le nombre de passagers attendants à la station
	int k = 0;
	for(int i=0; i<nbrePassagersAutorises && i<attenteStation;){
		if(fileStation[k] != NULL){
			pthread_kill(fileStation[k]->getThread(),SIGUSR1);
			i++;
		}
		k++;
	}

}

Rame::~Rame() {
	// TODO Auto-generated destructor stub
}
